#include <iostream>
#include <fstream>

using namespace std;

typedef struct {
  unsigned long int tamanyo;
  unsigned long int lineas;
  unsigned long int palindromos;
} TResultado;

int esEspacio (char c) {
  return c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\b' || c == '\r';
}

int esPuntuacion (char c) {
  return c == '.' || c == ',' || c == ':' || c == ';' || c == '\"';
}

bool esPalindromo (char *c, int n) {
  int i = 0, j = n-1;
  bool b = true;
  while (b && i<j)
    b = c[i++] == c[j--];
  return b;
}

int leer (char * nombref, TResultado &r) {
  int res = 0, n;
  char buff[256], cAux = ' ', c;
  
  r.tamanyo = 0;
  r.lineas = 1;
  r.palindromos = 0;
  ifstream entrada (nombref);
  if (!entrada) res = -1;
  
  else {
    while (!entrada.eof()) {
      r.tamanyo ++;
      c = entrada.get();
      if (c == '\n') r.lineas ++;
      if (esEspacio(cAux) || esPuntuacion(cAux)) {
        if (!esEspacio(c) && !esPuntuacion(c)) { // Es principio de palabra
          n = 1;
          buff[0] = c;
        }
      }
      else { /* El anterior caracter fue letra */
        if (esEspacio(c) || esPuntuacion(c)) {// Es final de palabra
          if (esPalindromo(buff, n))
            r.palindromos ++;
        }
        else // Es parte de palabra
          buff[n++] = c;
      }
      cAux = c;
    }
    entrada.close();
  }
  
  return res;
}

void escribirResultado (char * n, TResultado r) {
  ofstream f ("resultado.txt");
  f << "Nombre del archivo: " << n << endl;
  f << "Tamaño: " << r.tamanyo << endl;
  f << "Número de líneas: " << r.lineas << endl;
  f << "Número de palíndromos: " << r.palindromos << endl;
  f.close();
}

int main (int argc, char **args) {
  
  TResultado r;
  
  if (argc == 2) {
    if (leer (args[1], r) != -1)
      escribirResultado (args[1], r);
    else cout << "El archivo \"" << args[1] << "\" no existe." << endl;
  }
  else {
    cout << "Uso: leeArchivo <nombre_archivo>" << endl;
  }
  
  return 0;
}

